package com.itheima.mp.controller;

import cn.hutool.core.bean.BeanUtil;
import com.itheima.mp.domain.dto.UserFormDTO;
import com.itheima.mp.domain.po.User;
import com.itheima.mp.domain.query.UserQuery;
import com.itheima.mp.domain.result.Result;
import com.itheima.mp.domain.vo.UserVO;
import com.itheima.mp.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RequestMapping("/user")
@RestController
@RequiredArgsConstructor
@Api(tags = "用户管理")
public class UserController {
    private final UserService userService;

    @PostMapping
    @ApiOperation("新增用户")
    public Result saveUser(@RequestBody UserFormDTO userFormDTO){
        // service方法所需的参数是一个User对象，将dto对象中的数据拷贝到User对象中
//        User user = new User();
//        BeanUtils.copyProperties(userFormDTO, user);
        // 上述代码可以改写成下面的方式 注意调用的类是不一样的
        User user = BeanUtil.copyProperties(userFormDTO, User.class);
        // 调用Iservice中的方法
        userService.save(user);
        return Result.success();
    }

    @DeleteMapping("/{id}")
    @ApiOperation("删除用户")
    public Result deleteUser(@ApiParam("用户id") @PathVariable Long id){
        userService.removeById(id);
        return Result.success();
    }

    @GetMapping("/{id}")
    @ApiOperation("根据id查询用户")
    public Result<UserVO> queryUserById(@ApiParam("用户id") @PathVariable Long id){
//        // 根据id查询用户信息
//        User user = userService.getById(id);
//        // 将user对象拷贝给userVo
//        return Result.success(BeanUtil.copyProperties(user, UserVO.class));

        // 使用Db静态工具实现
        return Result.success(userService.queryUserAndAddressById(id));
    }

    @GetMapping
    @ApiOperation("根据id集合批量查询用户信息")
    public Result<List<UserVO>> batchQueryUsersByIds(@ApiParam("用户id集合") @RequestParam List<Long> ids){
//        // 根据id集合获取用户列表
//        List<User> users = userService.listByIds(ids);
//        // 将用户集合拷贝到UserVO集合中  这里拷贝的是集合，所以使用copyToList
//        return Result.success(BeanUtil.copyToList(users, UserVO.class));
        return Result.success(userService.batchQueryUsersByIds(ids));
    }

    @GetMapping("/{id}/deduction/{money}")
    @ApiOperation("扣除用户金额")
    public Result deductMoneyById(@ApiParam("用户id") @PathVariable Long id,
                                  @ApiParam("扣除金额") @PathVariable Integer money){
        userService.deductBalanceById(id, money);
        return Result.success();
    }

    @GetMapping("/list")
    @ApiOperation("复杂条件查询")
    public Result<List<UserVO>> conditionQueryList(UserQuery userQuery){
        String name = userQuery.getName();
        Integer status = userQuery.getStatus();
        Integer minBalance = userQuery.getMinBalance();
        Integer maxBalance = userQuery.getMaxBalance();
        // 查询条件
        List<User> userList = userService.lambdaQuery()
                .like(name != null, User::getUsername, userQuery.getName()) // 模糊查询名字
                .eq(status != null, User::getStatus, userQuery.getStatus()) // 状态
                .ge(minBalance != null, User::getBalance, minBalance) // 大于最小余额
                .le(maxBalance != null, User::getBalance, maxBalance) // 小于最大余额
                .list(); // 返回集合 还有 .one() // 返回单个结果 .count() 返回计数
        return Result.success(BeanUtil.copyToList(userList, UserVO.class));
    }

}
